#pragma once

#ifndef CORE_H
#define CORE_H

namespace user_init {
using InitFnType = struct {
    void (*entry)();
};
}  // namespace user_init

/* ------- 初始化函数注册接口 ------- */
#define InitWithPriority(fn, level)                                        \
    void fn();                                                             \
    static const user_init::InitFnType __init_fn_##fn                      \
        __attribute__((used, section(".sheriff_init_fn." #level))) = {fn}; \
    void fn()
// 按顺序进行初始化
#define InitPreCore(name) InitWithPriority(name, 15)
// ---- 系统内核启动
#define InitPostCore(name) InitWithPriority(name, 25)
#define InitPreEnv(name) InitWithPriority(name, 35)
// ---- BSP 初始化
#define InitEnv(name) InitWithPriority(name, 45)
#define InitPostEnv(name) InitWithPriority(name, 55)
#define InitPreDevice(name) InitWithPriority(name, 65)
// ---- 全局对象构造
#define InitDevice(name) InitWithPriority(name, 75)
#define InitPostDevice(name) InitWithPriority(name, 85)
#define InitLate(name) InitWithPriority(name, 95)
// ---- 预创建线程启动

/**
 * @brief 运行时错误
 * @param err 错误信息
 */
[[noreturn]] void osError(char const* err);

/**
 * @brief 运行时断言
 * @param condition 条件
 * @param message 信息
 */
#define os_assert(condition, message) \
    do {                              \
        if (!(condition)) {           \
            osError(message);         \
        }                             \
    } while (false)

#endif  // CORE_H